package com.hundsun.documentripper.service.impl;

import java.util.List;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.hundsun.documentripper.domain.pojo.File;
import com.hundsun.documentripper.domain.pojo.ProductVersion;
import com.hundsun.documentripper.domain.query.BaseQuery;
import com.hundsun.documentripper.error.BaseException;
import com.hundsun.documentripper.mapper.ProductVersionMapper;
import com.hundsun.documentripper.service.DocumentService;
import com.hundsun.documentripper.service.FileService;
import com.hundsun.documentripper.service.ProductVersionService;

/**
 * Note：
 *
 * @author ：mengjw
 * @description：产品版本接口实现
 * @date ：Created in 2021/1/27
 */
@Service
public class ProductVersionServiceImpl implements ProductVersionService {

    @Autowired
    private ProductVersionMapper productVersionMapper;
    @Autowired
    private DocumentService documentService;
    @Autowired
    private FileService fileService;

    @Override
    @SuppressWarnings("all")
    public void insertProductVersion(ProductVersion productVersion) {
        // 判断产品版本编号是否已经存在
        QueryWrapper<ProductVersion> wrapper = new QueryWrapper<>();
        wrapper.eq("product_uuid", productVersion.getProductUuid());
        wrapper.eq("code", productVersion.getCode());
        ProductVersion example = productVersionMapper.selectOne(wrapper);
        if (null != example) {
            throw new BaseException("3002");
        }
        // 生成新的版本编号
        String productVersionUuid = UUID.randomUUID().toString();
        productVersion.setUuid(productVersionUuid);
        // 判断是否存在旧版本
        ProductVersion preProductVersion = productVersionMapper.selectLast(productVersion.getProductUuid());
        if (null != preProductVersion) {
            // 如果有旧版本，则拷贝最新的旧版本的数据到新版本
            // 找到旧版本的全部文件
            List<File> fileList = fileService.getFileListByVersion(preProductVersion.getUuid());
            // 将旧文件及其节点备份到历史表，文件及其节点改为新的文件编号，插入新的文档版本信息
            for (File file : fileList) {
                file.setProductVersionUuid(productVersionUuid);
                fileService.newFile(file);
            }
        }
        // 插入新版本的记录
        productVersionMapper.insert(productVersion);
    }

    @Override
    public void updateProductVersion(ProductVersion productVersion) {
        productVersionMapper.updateById(productVersion);
    }

    @Override
    public ProductVersion getProductVersionById(String uuid) {
        return productVersionMapper.selectById(uuid);
    }

    @Override
    public IPage<ProductVersion> getProductVersionListByPage(BaseQuery baseQuery, String productUuid) {
        QueryWrapper<ProductVersion> wrapper = new QueryWrapper<>();
        wrapper.eq("product_uuid", productUuid);
        // 按照code倒序
        wrapper.orderByDesc("code");
        return productVersionMapper.selectPage(new Page<ProductVersion>(baseQuery.getCurrent(), baseQuery.getSize()), wrapper);
    }

    @Override
    public void deleteProductVersion(String uuid) {
        // 获取当前版本信息和最新版本信息
        ProductVersion productVersion = productVersionMapper.selectById(uuid);
        ProductVersion lastProductVersion = getLastProductVersion(productVersion.getProductUuid());
        // 删除当前版本
        productVersionMapper.deleteById(uuid);
        boolean isLast = false;
        if (productVersion.getCode().equals(lastProductVersion.getCode())) {
            // 如果是最新版本则重新获取最新的版本
            isLast = true;
            lastProductVersion = getLastProductVersion(productVersion.getProductUuid());
        }
        // 删除版本后需要删除相关的数据
        // 删除文档版本
        documentService.deleteDocumentVersionsByProductVersion(uuid);
        // 删除产品版本的文件及其文件节点
        if (isLast) {
            fileService.deleteFileByVersion(uuid);
            // 恢复最新的版本到当前表
            fileService.recoverFile(lastProductVersion.getUuid());
        } else {
            fileService.deleteFileHistoryByVersion(uuid);
        }
    }

    @Override
    public ProductVersion getLastProductVersion(String productUuid) {
        return productVersionMapper.selectLast(productUuid);
    }

    @Override
    public List<ProductVersion> getAllProductVersion(String productUuid, boolean codeDesc) {
        QueryWrapper<ProductVersion> wrapper = new QueryWrapper<>();
        wrapper.eq("product_uuid", productUuid);
        // 按照code排序
        if (codeDesc) {
            wrapper.orderByDesc("code");
        } else {
            wrapper.orderByAsc("code");
        }
        return productVersionMapper.selectList(wrapper);
    }

    @Override
    public boolean isLastProductVersion(String productVersionUuid) {
        ProductVersion productVersion = productVersionMapper.selectById(productVersionUuid);
        ProductVersion lastProductVersion = getLastProductVersion(productVersion.getProductUuid());
        return productVersion.getCode().equals(lastProductVersion.getCode());
    }

}